import os
from docx import Document
from docx.shared import Cm
from datetime import datetime, timedelta

# 中文星期映射
weekday_map = {
    0: "星期一",
    1: "星期二",
    2: "星期三",
    3: "星期四",
    4: "星期五",
    5: "星期六",
    6: "星期日"
}

holiday = [
    "2024年09月15日",
    "2024年09月16日",
    "2024年09月17日",
    "2024年10月01日",
    "2024年10月02日",
    "2024年10月03日",
    "2024年10月04日",
    "2024年10月05日",
    "2024年10月06日",
    "2024年10月07日",
]

def insert_table(table, index, current_date):
    # 第一行：日期和星期
    row = table.rows[index]
    row.height = Cm(1.10)
    row.cells[0].text = "日 期"
    row.cells[0].width = Cm(1.85)

    row.cells[1].text = current_date.strftime("%Y年%m月%d日")
    row.cells[1].width = Cm(5.65)

    row.cells[2].text = "星 期"
    row.cells[2].width = Cm(1.85)

    row.cells[3].text = weekday_map[current_date.weekday()]
    row.cells[3].width = Cm(1.85)

    # 第二行：实习内容
    row = table.rows[index + 1]
    row.height = Cm(4.40)

    row.cells[0].text = "实 习\n\n内 容"
    row.cells[0].width = Cm(1.85)

    row.cells[1].merge(row.cells[3])
    row.cells[1].width = Cm(13.15)

    # 第三行：收获或心得体会
    row = table.rows[index + 2]
    row.height = Cm(4.40)

    row.cells[0].text = "收 获\n\n或\n\n心 得\n体 会"
    row.cells[0].width = Cm(1.85)

    row.cells[1].merge(row.cells[3])
    row.cells[1].width = Cm(13.15)


def create_internship_log(start_date_str, end_date_str, output_filename="data/实习日志_输出.docx"):
    # 将输入的日期字符串转换为datetime对象
    start_date = datetime.strptime(start_date_str, "%Y年%m月%d日")
    end_date = datetime.strptime(end_date_str, "%Y年%m月%d日")

    # 创建新文档
    doc = Document()

    # 添加标题
    title = doc.add_paragraph("实 习 日 志")
    title_format = title.paragraph_format
    title_format.alignment = 1  # 居中对齐

    # 生成日期列表
    current_date = start_date
    while current_date <= end_date:
        # 创建表格 (6行4列)
        table = doc.add_table(rows=6, cols=4)
        table.style = 'Table Grid'

        # 不要星期六和星期天 以及 法定节假日，这里排除调休的情况
        while current_date.weekday() in [5, 6] or current_date.strftime("%Y年%m月%d日") in holiday:
            current_date = current_date + timedelta(days=1)

        insert_table(table, 0, current_date)

        current_date = current_date + timedelta(days=1)

        # 不要星期六和星期天 以及 法定节假日，这里排除调休的情况
        while current_date.weekday() in [5, 6] or current_date.strftime("%Y年%m月%d日") in holiday:
            current_date = current_date + timedelta(days=1)

        # 第四行：日期和星期
        insert_table(table, 3, current_date)

        # 添加分页符
        doc.add_page_break()

        current_date = current_date + timedelta(days=1)

    # 保存文档
    output_dir = os.path.dirname(output_filename)
    if output_dir and not os.path.exists(output_dir):
        os.makedirs(output_dir)
    doc.save(output_filename)
    # 给外部的 main 函数返回文件路径
    return output_filename


def extend_docx(start_date, end_date):
    """
    :param start_date: 开始日期，格式如 2024年9月4日
    :param end_date:   结束日期，格式如 2024年12月13日
    :return: 保存好了的文件路径
    """
    return create_internship_log(start_date, end_date)

# 使用示例
if __name__ == "__main__":
    start_date = "2024年9月4日"
    end_date = "2024年12月13日"
    extend_docx(start_date, end_date)